home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / utils / disk-man / fdformat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-16  |  2.3 KB  |  101 lines

  1. /* fdformat.c  -  Low-level formats a floppy disk. */
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <fcntl.h>
  6. #include <errno.h>
  7. #include <linux/fd.h>
  8.  
  9.  
  10. static int ctrl;
  11. struct floppy_struct param;
  12.  
  13.  
  14. #define SECTOR_SIZE 512
  15. #define PERROR(msg) { perror(msg); exit(1); }
  16.  
  17.  
  18. static void format_disk(char *name)
  19. {
  20.     struct format_descr descr;
  21.     int track;
  22.     char dummy;
  23.  
  24.     printf("Formatting ... ");
  25.     fflush(stdout);
  26.     if (ioctl(ctrl,FDFMTBEG,NULL) < 0) PERROR("\nioctl(FDFMTBEG)");
  27.     for (track = 0; track < param.track; track++) {
  28.     descr.track = track;
  29.     descr.head = 0;
  30.     if (ioctl(ctrl,FDFMTTRK,(int) &descr) < 0) PERROR("\nioctl(FDFMTTRK)");
  31.     printf("%3d\b\b\b",track);
  32.     fflush(stdout);
  33.     if (param.head == 2) {
  34.         descr.head = 1;
  35.         if (ioctl(ctrl,FDFMTTRK,(int) &descr) < 0)
  36.         PERROR("\nioctl(FDFMTTRK)");
  37.     }
  38.     }
  39.     if (ioctl(ctrl,FDFMTEND,NULL) < 0) PERROR("\nioctl(FDFMTEND)");
  40.     printf("done\n");
  41. }
  42.  
  43.  
  44. static void verify_disk(char *name)
  45. {
  46.     unsigned char *data;
  47.     int fd,cyl_size,cyl,count;
  48.  
  49.     cyl_size = param.sect*param.head*512;
  50.     if ((data = (unsigned char *) malloc(cyl_size)) == NULL) PERROR("malloc");
  51.     printf("Verifying ... ");
  52.     fflush(stdout);
  53.     if ((fd = open(name,O_RDONLY)) < 0) PERROR(name);
  54.     for (cyl = 0; cyl < param.track; cyl++) {
  55.     printf("%3d\b\b\b",cyl);
  56.     fflush(stdout);
  57.     if (read(fd,data,cyl_size) != cyl_size) PERROR("read");
  58.     for (count = 0; count < cyl_size; count++)
  59.         if (data[count] != FD_FILL_BYTE) {
  60.         printf("bad data in cyl %d\nContinuing ... ",cyl);
  61.         fflush(stdout);
  62.         break;
  63.         }
  64.     }
  65.     printf("done\n");
  66.     if (close(fd) < 0) PERROR("close");
  67. }
  68.  
  69.  
  70. static void usage(char *name)
  71. {
  72.     char *this;
  73.  
  74.     if (this = strrchr(name,'/')) name = this+1;
  75.     fprintf(stderr,"usage: %s [ -n ] device\n",name);
  76.     exit(1);
  77. }
  78.  
  79.  
  80. main(int argc,char **argv)
  81. {
  82.     int verify;
  83.     char *name;
  84.  
  85.     name = argv[0];
  86.     verify = 1;
  87.     if (argc > 1 && argv[1][0] == '-') {
  88.     if (argv[1][1] != 'n') usage(name);
  89.     verify = 0;
  90.     argc--;
  91.     argv++;
  92.     }
  93.     if (argc != 2) usage(name);
  94.     if ((ctrl = open(argv[1],3)) < 0) PERROR(argv[1]);
  95.     if (ioctl(ctrl,FDGETPRM,(int) ¶m) < 0) PERROR("ioctl(FDGETPRM)");
  96.     printf("%sle-sided, %d tracks, %d sec/track. Total capacity %d kB.\n",
  97.       param.head ? "Doub" : "Sing",param.track,param.sect,param.size >> 1);
  98.     format_disk(argv[1]);
  99.     if (verify) verify_disk(argv[1]);
  100. }
  101.